package threadTest.auxiliaryUtils;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 功能描述: 示例用法： 下面给出了两个类，其中一组 worker 线程使用了两个倒计数锁存器：
         *
         * 第一个类是一个启动信号，在 driver 为继续执行 worker 做好准备之前，它会阻止所有的 worker 继续执行。
         * 第二个类是一个完成信号，它允许 driver 在完成所有 worker 之前一直等待。
 * 2024/02/22
 * <p>
 * ZhangYi
 */
public class CountDownLatchTest {

    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(10); // 初始化CountDownLatch对象，传入计数器的初始值，计数器初始值为10


        List<String> lists = Arrays.asList("张三",
                                           "李四",
                                           "王五",
                                           "张三1",
                                           "李四1",
                                           "王五1",
                                           "张三2",
                                           "李四2",
                                           "王五2",
                                           "张三3",
                                           "张三4");
        for (String name : lists) {  // 启动 10 个线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(" 线程 " + Thread.currentThread().getName() + " 学生 " + name + " 离开了 ");
                    latch.countDown();  // 计数器减1
                }
            },
                       "线程" + name).start();
        }

        try {
//            latch.await();  // 等待计数器减到0，再执行后续代码 , 如果这里不为0 ,就会一直的阻塞
            //，主线程会等待最多 5 秒，直到所有子线程完成任务。如果所有子线程在 5 秒内完成，
            // 则继续执行后续操作；否则，抛出 TimeoutException 并处理超时情况。
            latch.await(5, TimeUnit.SECONDS);
            System.out.println("锁门了");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

    }


    //class Driver { // ...
    //    void main() throws InterruptedException {
    //        CountDownLatch startSignal = new CountDownLatch(1);
    //        CountDownLatch doneSignal = new CountDownLatch(N);
    //
    //        for (int i = 0; i < N; ++i) // create and start threads
    //            new Thread(new Worker(startSignal, doneSignal)).start();
    //
    //        doSomethingElse();            // don't let run yet
    //        startSignal.countDown();      // let all threads proceed
    //        doSomethingElse();
    //        doneSignal.await();           // wait for all to finish
    //    }
    //}
    //
    //class Worker implements Runnable {
    //    private final CountDownLatch startSignal;
    //    private final CountDownLatch doneSignal;
    //    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
    //        this.startSignal = startSignal;
    //        this.doneSignal = doneSignal;
    //    }
    //    public void run() {
    //        try {
    //            startSignal.await();
    //            doWork();
    //            doneSignal.countDown();
    //        } catch (InterruptedException ex) {} // return;
    //    }
    //
    //    void doWork() { ... }
    //}

}
